package com.aaa.service.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author ${崔灿}
 * @date 2022/11/13 19:56
 **/
@Component
@Aspect
public class TransactionAop {
    @Pointcut("execution(*  com.aaa.service.Impl.*.*(..))")
    private void transactio(){}

    /**
     * 第一个*:表示访问修饰符以及返回类型
     * 第二个*:表示任意类
     * 第三个*:表示任意方法
     * (..): 表示任意参数
     */

    @Before("transactio()")
    public void before() {
        System.out.println("前置通知***开启事务");

    }
    @After("transactio()")
    public void after() {
        System.out.println("后置通知--提交事务");
    }

    @AfterReturning("transactio()")
    public void afterReturning(){
        System.out.println("后置返回通知--有返回值的时候才会执行");
    }

    @AfterThrowing("transactio()")
    public void afterThrowing(){
        System.out.println("异常通知--事务回滚");
    }

    @Around("transactio()")
    public void around(ProceedingJoinPoint joinPoint){
        System.out.println("环绕通知--前");
        try {
            joinPoint.proceed();//调用连接点方法
        } catch (Throwable throwable) {
            System.out.println("环绕通知--异常");
        }finally {
            System.out.println("最后通知");
        }
    }
}
